<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class jQuickForm extends HTML_QuickForm2{
	var $_sec;

    static $element_templates = array();

    static function logElementTemplate($element, $template){
        self::$element_templates[] = '<fieldset><legend>'.$element.'</legend>'.$template.'</fieldset>';
    }

    public function __construct($id, $method = 'post', $attributes = null, $trackSubmit = false){
        HTML_Common2::setOption('charset','UTF-8');
        $method = ('GET' == strtoupper($method))? 'get': 'post';
        if (empty($id)) {
            $id          = self::generateId('');
            $trackSubmit = false;
        } else {
            self::storeId($id);
        }
        $this->attributes = array_merge(
                                self::prepareAttributes($attributes),
                                array('id' => (string)$id, 'method' => $method)
                            );
        if (!isset($this->attributes['action'])) {
			global $SEC;
			$this->_sec = $SEC;

//			dump($this->_sec);

            $this->attributes['action'] = $this->_sec->xss_clean($_SERVER['REQUEST_URI']);
        }
        if ($trackSubmit && isset($_REQUEST['_qf_csrf_token__' . $id]) && ($_REQUEST['_qf_csrf_token__' . $id]==$this->getToken($id)) ||
            !$trackSubmit && ('get' == $method && !empty($_GET) ||
                              'post' == $method && (!empty($_POST) || !empty($_FILES))))
        {
            $this->addDataSource(new HTML_QuickForm2_DataSource_SuperGlobal(
                $method, get_magic_quotes_gpc()
            ));
        }
        if ($trackSubmit) {
            $this->appendChild(HTML_QuickForm2_Factory::createElement(
                'hidden', '_qf_csrf_token__' . $id
            ))->setValue($this->getToken($id));
        }
        //переключением опции можно выключить автоматическую XSS-фильтрацию
        if(self::config()->getUseXssFilter()){
            $this->addFilter(array('jQuickForm_Filter_Xss','applyFilter'));
        }
    }

    /**
     * Токен формы, если он приходит не правильный, форма считается не заполненной
     *
     * @return string
     */
    function getToken($value){
        return md5(session_id() . $value . self::config()->getPrivateKey());
    }


    /**
     * Задать mask definition
     *
     * use: jQuickform::jqfMaskDefinition('~','+-');
     *
     * @param unknown_type $name
     * @param unknown_type $value
     */
    function jqfMaskDefinition($name, $value){
        jQuickForm::js()->needJqueryMask();
        jQuickForm::js()->addJsOnload('jQuery.mask.definitions["'.$name.'"]="['.$value.']"');
    }

    public function render(HTML_QuickForm2_Renderer $renderer){
        $renderer = parent::render($renderer);
        $script   = $renderer->getJavascriptBuilder()->getFormJavascript($this->getId(),false);
        if($script){
            jQuickForm::js()->addJsInline($script);
//            jQuickForm::js()->addJsInline(
//            '
//qf.Validator.prototype.onInvalid = function(errorMap)
//    alert(this.msgPrefix + \'\n - \' + errorMap.getValues().join(\'\n - \') + \'\n\' + this.msgPostfix);
//};
//            ','onload_'.$this->getId()
//            );
        }
        /*
    jQuery("span.jqf_error").text("").hide();
    jQuery("div.jqf_error").removeClass("jqf_error");
    var errors = errorMap.getValues();
    for(var i in errors) {
        jQuery("#"+i).parent().parent().addClass("jqf_error");
        jQuery("#jqferr-"+i).text(errors[i]).show();
        alert("#jqferr-"+i);
    }

        */
        return $renderer;
    }



    /**
     * Реализация паттерна Singleton
     *
     * @return jQuickForm_Js
     */
    static function js()
    {
        static $js;
        if(!$js){
            $js = new jQuickForm_Js();
        }
        return $js;
    }



    /**
     *
     * @return jQuickForm_Css
     */
    static function css()
    {
        static $css;
        if(!$css){
            $css = new jQuickForm_Css();
        }
        return $css;
    }



    /**
     *
     * @return jQuickForm_Config
     */
    static function config()
    {
        static $config;
        if(!$config){
            $config = new jQuickForm_Config();
        }
        return $config;
    }

    function addOnSubmit($js){
        jQuickForm::js()->addJsOnload('
        jQuery("#'.$this->getId().'").submit(function(e){
            var form = e.target;
            if (form.validator && !form.validator.run(form)) {
            } else {
                '.$js.'
                e.preventDefault();
            }
        });
        ');

    }


}
?>